package br.com.speedprevweb.dao.impl;

import br.com.speedprevweb.dao.ClassificacaoServidorDao;
import br.com.speedprevweb.model.ClassificacaoServidor;
import br.com.speedprevweb.util.HibernateUtil;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class ClassificacaoServidorDaoImpl implements ClassificacaoServidorDao {

  private boolean valid(ClassificacaoServidor classificacaoServidor) {
    if (classificacaoServidor.getDsClassificacaoServidor().isEmpty()) {
      return false;
    } else {
      return !classificacaoServidor.getDsClassificacaoServidor().isEmpty();
    }
  }

  @Override
  public void inserir(ClassificacaoServidor classificacaoServidor) {
    Session session = null;
    Transaction t = null;

    try {
      session = HibernateUtil.getSessionFactory().openSession();
      t = session.beginTransaction();
      if (valid(classificacaoServidor)) {
        session.save(classificacaoServidor);
      }
      t.commit();
    } catch (RuntimeException e) {
      try {
        t.rollback();
      } catch (RuntimeException rbe) {
        //log.error("Não foi possível reverter transação");
        System.out.println("Não foi possível reverter transação");
        throw e;
      }
    } finally {
      if (session != null) {
        session.close();
      }
    }
  }

  @Override
  public void alterar(ClassificacaoServidor classificacaoServidor) {
    Session session = null;
    Transaction t = null;

    try {
      session = HibernateUtil.getSessionFactory().openSession();
      t = session.beginTransaction();
      if (valid(classificacaoServidor)) {
        session.update(classificacaoServidor);
      }
      t.commit();
    } catch (RuntimeException e) {
      try {
        t.rollback();
      } catch (RuntimeException rbe) {
        System.out.println("Não foi possível reverter transação");
        throw e;
      }
    } finally {
      if (session != null) {
        session.close();
      }
    }
  }

  @Override
  public void excluir(ClassificacaoServidor classificacaoServidor) {
    Session session = null;
    Transaction t = null;

    try {
      session = HibernateUtil.getSessionFactory().openSession();
      t = session.beginTransaction();
      session.delete(classificacaoServidor);
      t.commit();
    } catch (RuntimeException e) {
      try {
        t.rollback();
      } catch (RuntimeException rbe) {
        System.out.println("Não foi possível reverter transação");
        throw e;
      }
    } finally {
      if (session != null) {
        session.close();
      }
    }
  }

  @Override
  public ClassificacaoServidor getClassificacaoServidor(ClassificacaoServidor classificacaoServidor) {
    Transaction tx = null;
    Session session = HibernateUtil.getSessionFactory().openSession();
    String sql = "FROM ClassificacaoServidor cs where cs.idClassificacaoServidor = :pId";
    try {
      tx = session.beginTransaction();
      Query query = session.createQuery(sql);
      query.setCharacter("pId", classificacaoServidor.getIdClassificacaoServidor());
      return (ClassificacaoServidor) query.uniqueResult();
    } catch (HibernateException e) {
      tx.rollback();
      throw e;
    }
  }

  @Override
  public List listarTodos() {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction t = session.beginTransaction();
    List<ClassificacaoServidor> lista = session.createQuery("FROM ClassificacaoServidor cs order by tr.dsClassificacaoServidor").list();
    t.commit();
    session.close();
    return lista;
  }    
}